library(tidyverse)
library(readr)
# Descarga los tres archivos CSV para esta tarea
fellowship <- read_csv("The_Fellowship_of_the_Ring.csv")
tt <- read_csv("The_Two_Towers.csv")
rotk <- read_csv("The_Return_of_the_King.csv")
En el panel llamado environment en RStudio, haz click en las bases de datos, sólo haciendo esto mira los datos y responde a las preguntas:
1: ¿En qué formato están estos datos? Wide o Long? Los datos están en formato long
2: ¿Cuál es el número total de palabras usadas por hobbits masculinos en las 3 películas? En fellowship of the ring, hablan 3644 palabras, en return of the king 2673 y en two towers 2463, por lo que el total es de 8780 palabras entre las tres películas.
3: ¿Hay alguna raza dominante en alguna película? Esa raza dominante, ¿difiere entre películas? Durante fellowship of the ring y return of the king, predomina la participación de los Hobbits, sin embargo en two towers los humanos hablan más que el resto de razas.
4: ¿Esta manera de mirar los datos es aplicable si te doy información sobre más películas o sobre todas las razas? Podría hacerse pero consumiría demasiado tiempo y no sería eficiente por la cantidad de observaciones y bases de datos que existirían.
# bind_rows() pone varias bases de datos una sobre otra
# gather() rearregla los datos en formato largo (tidy)
lotr <- bind_rows(fellowship, tt, rotk) %>%
gather(key = 'Gender', value = 'Words', Female, Male)
5: ¿Cuál es la diferencia entre la nueva base de datos que creaste (lotr) y las 3 otras? Que en la nueva base de datos se colapsa toda la info sin necesidad de cambiar entre bases para observarla, además de esta manera se puede realizar visualizaciones con todos estos datos.
6: Es mucho más fácil trabajar con los datos en formato tidy, puedes usar film, género y raza para agregar los datos. Por ejemplo, ¿cuál es el número total de palabras usadas por hobbits masculinos?
lotr %>%
group_by(Gender, Race) %>%
summarize(total_words = sum(Words))
## # A tibble: 6 x 3
## # Groups: Gender [2]
## Gender Race total_words
## <chr> <chr> <dbl>
## 1 Female Elf 1743
## 2 Female Hobbit 16
## 3 Female Man 669
## 4 Male Elf 1994
## 5 Male Hobbit 8780
## 6 Male Man 8043
En este caso obtenemos el mismo resultado que en incisos anteriores pero de manera más automática gracias a tidy.
7: ¿Cuál es la diferencia entre estos dos chunks? ¿Cómo se produce esa diferencia?
lotr %>%
group_by(Gender, Race) %>%
summarize(total_words = sum(Words)) %>%
mutate(percent = total_words / sum(total_words))
## # A tibble: 6 x 4
## # Groups: Gender [2]
## Gender Race total_words percent
## <chr> <chr> <dbl> <dbl>
## 1 Female Elf 1743 0.718
## 2 Female Hobbit 16 0.00659
## 3 Female Man 669 0.276
## 4 Male Elf 1994 0.106
## 5 Male Hobbit 8780 0.467
## 6 Male Man 8043 0.427
lotr %>%
group_by(Gender, Race) %>%
summarize(total_words = sum(Words)) %>%
ungroup() %>%
mutate(percent = total_words / sum(total_words))
## # A tibble: 6 x 4
## Gender Race total_words percent
## <chr> <chr> <dbl> <dbl>
## 1 Female Elf 1743 0.0820
## 2 Female Hobbit 16 0.000753
## 3 Female Man 669 0.0315
## 4 Male Elf 1994 0.0939
## 5 Male Hobbit 8780 0.413
## 6 Male Man 8043 0.379
La diferencia se produce sobre el porcentaje, en el primer caso siguen agrupados por gender mientras que en la segunda no estan agrupados entonces el porcentaje es sobre toda la población.
8: También es más fácil graficar datos agregados con datos tidy. ¿Para qué sirve la expresión position="dodge"? ¿Qué gráfico (con o sin “dodge”) te resulta más fácil de interpretar y por qué? Dodge nos permite generar diferentes barras para cada característica (en este caso, la raza). En este caso, se me facilita más sin dodge porque así se aprecia más tanto los pequeños cambios porcentuales como la diferencia entre pequeños saltos en el caso de las mujeres.
lotr_gender_race <- lotr %>%
group_by(Gender, Race) %>%
summarize(total_words = sum(Words)) %>%
ungroup() %>%
mutate(percent = total_words / sum(total_words))
ggplot(lotr_gender_race, aes(x = Gender, y = total_words, fill = Race)) +
geom_col(position = "dodge") + scale_y_continuous(sec.axis = sec_axis(~ . / sum(lotr_gender_race$total_words), labels=scales::percent))
# BONUS TIP
# Es posible agregar un segundo eje-y en ggplot siempre y cuando sea una transformación directa
# del eje-y original.
# Agrega este código como una capa al gráfico de arriba y ve qué pasa
# (las capas se agregan incorporando un signo de +):
# scale_y_continuous(sec.axis = sec_axis(~ . / sum(lotr_gender_race$total_words), labels=scales::percent))
Usando los datos tidy de El Señor de los Anillos, responde a estas preguntas y haz un gráfico para cada una:
1: ¿Hay alguna raza dominante en alguna película? Esa raza dominante, ¿difiere entre películas? En este gráfico podemos ver que la participación de elfos es la más baja en todas las películas. Los hobbits dominan en fellowship y casi empatan con humanos en rotk; sin embargo, los humanos dominan en participación en tt.
lotr_movie_race <- lotr %>%
group_by(Film, Race) %>%
summarize(total_words = sum(Words)) %>%
ungroup() %>%
mutate(percent = total_words / sum(total_words))
ggplot(lotr_movie_race, aes(x = Film, y = total_words, fill = Race)) +
geom_col(position = "dodge") + scale_y_continuous(sec.axis = sec_axis(~ . / sum(lotr_movie_race$total_words), labels=scales::percent))
2: ¿Hay algún género dominante en alguna película? En todas las películas es evidente que la participación masculina es mayor.
lotr_movie_gender <- lotr %>%
group_by(Film, Gender) %>%
summarize(total_words = sum(Words)) %>%
ungroup() %>%
mutate(percent = total_words / sum(total_words))
ggplot(lotr_movie_gender, aes(x = Film, y = total_words, fill = Gender)) +
geom_col() + scale_y_continuous(sec.axis = sec_axis(~ . / sum(lotr_movie_gender$total_words), labels=scales::percent))
3: ¿Cuál es el número promedio de palabras usadas por los elfos femeninos? (en vez de crear una variable para calcular sum() en summarize(), usa mean()) En promedio dicen 581 palabras por película.
lotr %>%
group_by(Gender, Race) %>%
summarize(prom_words = mean(Words))
## # A tibble: 6 x 3
## # Groups: Gender [2]
## Gender Race prom_words
## <chr> <chr> <dbl>
## 1 Female Elf 581
## 2 Female Hobbit 5.33
## 3 Female Man 223
## 4 Male Elf 665.
## 5 Male Hobbit 2927.
## 6 Male Man 2681
4: Muestra un resumen del número de palabras usadas por cada raza y género en las 3 películas (vas a tener que agrupar usando las 3 variables (usando group_by), y probablemente necesites usar una como faceta en tu gráfico).
lotr_movie_gender_race <- lotr %>%
group_by(Film, Gender, Race) %>%
summarize(total_words = sum(Words)) %>%
ungroup() %>%
mutate(percent = total_words / sum(total_words))
ggplot(lotr_movie_gender_race, aes(x = Gender, y = total_words, fill = Film)) +
geom_col() +
facet_wrap(~ Race) +
scale_y_continuous(sec.axis = sec_axis(~ . / sum(lotr_movie_gender_race$total_words), labels=scales::percent))
Piensa dos preguntas sobre la distribución de palabras usadas por raza, sexo y/o película para la trilogía de El Señor de los Anillos.
En vez de usar un gráfico de barras, usa un gráfico de lollipop para una y un heatmap para la otra. Mira el código de la clase para ver ejemplos (probablemente uses geom_pointrange y geom_tile())
1: Explica tu pregunta … Qué película tiene mayor cantidad de palabras habladas?
lotr_words_film <- lotr %>%
group_by(Film) %>%
summarize(avg_word = mean(Words))
ggplot(lotr_words_film, aes(x = Film, y = avg_word)) +
geom_pointrange(aes(ymin = 0, ymax = avg_word), fatten = 3, size = 2) +
scale_y_continuous(labels = scales::comma) +
labs(x = "Película", y = "Promedio de Palabras") +
theme_gray() +
coord_flip()
2: Explica tu pregunta … En qué película se habla más según la raza?
lotr_words_film <- lotr %>%
group_by(Film, Race) %>%
summarize(avg_words = mean(Words))
heatmap <- ggplot(lotr_words_film, aes(x = Race, y = fct_rev(Film),
fill = avg_words)) +
geom_tile() +
scale_fill_viridis_c(option = "inferno", name = "Palabras promedio") +
labs(x = "Raza", y = "Película",
title = "Conteo de palabras en El señor de los Anillos") +
coord_equal() +
theme_minimal() +
theme(legend.position = "bottom",
legend.key.width = unit(3, "lines"),
legend.key.height = unit(0.5, "lines"))
library(plotly)
##
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
ggplotly(heatmap)